var _ctCp437High = 'ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ '; // Windows-1252 differs from Latin-1 only in 128-159; the five unassigned bytes keep their Latin-1 control code. var _ctCp1252Mid = '€\u0081‚ƒ„…†‡ˆ‰Š‹Œ\u008dŽ\u008f\u0090‘’“”•–—˜™š›œ\u009džŸ'; function _ctOpt(id, fallback) { var el = document.getElementById(id); if (!el) return fallback; return el.type === 'checkbox' ? el.checked : el.value; } // Split the input into tokens and work out which base they are written in. function _ctAsciiTokens(input, format) { var s = input.trim(); if (!s) return { base: 10, tokens: [] }; if (format === 'auto') { if (/0x|\\x|&#x|\bU\+|\\u/i.test(s)) format = 'hex'; else if (/0b[01]/i.test(s)) format = 'binary'; else if (/&#\d/.test(s)) format = 'decimal'; else if (/^[01\s,;]+$/.test(s) && s.match(/[01]+/g).every(function(t){ return t.length >= 7 && t.length % 8 !== 1; })) format = 'binary'; else if (/[a-f]/i.test(s) && /^[\s,;:0-9a-f-]+$/i.test(s)) format = 'hex'; else format = 'decimal'; } var base = { decimal: 10, hex: 16, binary: 2, octal: 8 }[format]; s = s.replace(/&#x|&#|0x|\\x|\\u\{?|\bU\+|0b/gi, ' '); var digit = { 10: /[0-9]+/g, 16: /[0-9a-f]+/gi, 2: /[01]+/g, 8: /[0-7]+/g }[base]; var tokens = s.match(digit) || []; // A run with no separators, like 48656c6c6f or 0100100001101001, is split into bytes. var width = { 16: 2, 2: 8 }[base]; if (width && tokens.length === 1 && tokens[0].length > width && tokens[0].length % width === 0) { tokens = tokens[0].match(new RegExp('.{' + width + '}', 'g')); } return { base: base, format: format, tokens: tokens }; } function _ctDecodeBytes(bytes, charset) { if (charset === 'cp437') return bytes.map(function(b){ return b < 128 ? String.fromCharCode(b) : _ctCp437High.charAt(b - 128); }).join(''); if (charset === 'cp1252') return bytes.map(function(b){ return b >= 128 && b < 160 ? _ctCp1252Mid.charAt(b - 128) : String.fromCharCode(b); }).join(''); if (charset === 'latin1') return bytes.map(function(b){ return String.fromCharCode(b); }).join(''); return new TextDecoder('utf-8').decode(new Uint8Array(bytes)); } function _ctShowControls(text) { return text.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, function(ch){ var c = ch.charCodeAt(0); return String.fromCharCode(c === 127 ? 0x2421 : 0x2400 + c); }); } function convert(input) { var status = document.getElementById('a2t-status'); var parsed = _ctAsciiTokens(input || '', _ctOpt('a2t-format', 'auto')); var charset = _ctOpt('a2t-charset', 'auto'); var codes = [], skipped = 0; parsed.tokens.forEach(function(t){ var n = parseInt(t, parsed.base); if (isNaN(n) || n > 0x10FFFF || (n >= 0xD800 && n <= 0xDFFF)) skipped++; else codes.push(n); }); if (!codes.length) { if (status) status.textContent = skipped ? 'No valid codes found.' : ''; return ''; } var high = codes.some(function(n){ return n > 127 && n < 256; }); var used = charset; if (charset === 'auto') { used = 'unicode'; if (high && codes.every(function(n){ return n < 256; })) { try { new TextDecoder('utf-8', { fatal: true }).decode(new Uint8Array(codes)); used = 'utf8'; } catch (e) { used = 'cp1252'; } } } var out = ''; if (used === 'unicode') { out = codes.map(function(n){ return String.fromCodePoint(n); }).join(''); } else { // Values above 255 cannot be bytes, so they are read as Unicode code points. var run = []; codes.forEach(function(n){ if (n < 256) { run.push(n); return; } if (run.length) { out += _ctDecodeBytes(run, used); run = []; } out += String.fromCodePoint(n); }); if (run.length) out += _ctDecodeBytes(run, used); } if (_ctOpt('a2t-controls', true)) out = _ctShowControls(out); if (status) { var names = { utf8: 'UTF-8', cp1252: 'Windows-1252', latin1: 'Latin-1', cp437: 'DOS code page 437', unicode: 'Unicode' }; var msg = 'Read ' + codes.length + ' ' + parsed.format + ' code' + (codes.length === 1 ? '' : 's'); if (high || used !== 'unicode') msg += ' as ' + names[used]; if (skipped) msg += '. Skipped ' + skipped + ' invalid value' + (skipped === 1 ? '' : 's'); status.textContent = msg + '.'; } return out; } var _loadedScripts = {}; function loadScriptPromise(url) { if (_loadedScripts[url]) return _loadedScripts[url]; _loadedScripts[url] = new Promise(function (resolve, reject) { var s = document.createElement('script'); s.src = url; s.onload = resolve; s.onerror = reject; document.head.appendChild(s); }); return _loadedScripts[url]; } function replaceAll(find, replace, str) { return str.replace(new RegExp(find, 'g'), replace); } function beautify(str) { var result = ''; var length = str.length; var i = 0; var braceCountLeft = 0; var braceCountRight = 0; var withinQuotes = false; while (i < length) { var c = str[i]; if (c == '"' && (i == 0 || c[i - 1] != '\\')) { // non-escaped quotes withinQuotes = !withinQuotes; } if (!withinQuotes && (c == '}' || c == '{' || c == ',')) { console.log('Start####' + result); // look back and remove carriage returns and whitespace that are already there var resultIndex = result.length - 1; while (resultIndex >= 0 && (result[resultIndex] == ' ' || result[resultIndex] == '\r' || result[resultIndex] == '\n' || result[resultIndex] == '\t')) { resultIndex = resultIndex - 1; result = result.substr(0, resultIndex + 1); console.log('char ' + result[resultIndex] + '-----' + result + 'zzz ' + result.length + ' ' + resultIndex); } if (c == '{') { braceCountLeft++; result += c + '\r' + GetTabs(braceCountLeft - braceCountRight); } else if (c == '}') { braceCountRight++; // precede with carriage return result += '\r' + GetTabs(braceCountLeft - braceCountRight) + c; } else if (c == ',') { result += c + '\r' + GetTabs(braceCountLeft - braceCountRight); } var nextChar = ''; // advance through whitespace and remove carriage returns that are already there while (i < length && (str[i + 1] == ' ' || str[i + 1] == '\r' || str[i + 1] == '\n' || str[i + 1] == '\t')) { i++; } } else { result += str[i]; } i++; } return result; } function GetTabs(count) { var result = ''; for (var i = 0; i < count; i++) { result += ' '; } return result; }